<!DOCTYPE HTML>
<html lang="zh-CN" class="sidebar-visible no-js light">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>Rust 程序设计语言 - Rust 程序设计语言 简体中文版</title>
        

        <!-- Custom HTML head -->
        

        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="Rust 程序设计语言 简体中文版">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff">

        <link rel="shortcut icon" href="https://rust.bootcss.com/favicon.png">
        <link rel="stylesheet" href="static/css/variables.css">
        <link rel="stylesheet" href="static/css/general.css">
        <link rel="stylesheet" href="static/css/chrome.css">
        <link rel="stylesheet" href="static/css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="static/css/font-awesome.min.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="static/css/highlight1.css">
        <link rel="stylesheet" href="static/css/tomorrow-night.css">
        <link rel="stylesheet" href="static/css/ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        
        <link rel="stylesheet" href="static/css/ferris.css">
        

        
    </head>
    <body>
        <!-- Provide site root to javascript -->
        <script type="text/javascript">
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script type="text/javascript">
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script type="text/javascript">
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('light')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script type="text/javascript">
            var html = document.querySelector('html');
            var sidebar = 'hidden';
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item expanded affix "><a href="javascript:;">Rust 程序设计语言</a></li><li class="chapter-item expanded affix "><a href="javascript:;">前言</a></li><li class="chapter-item expanded affix "><a href="javascript:;">介绍</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">1.</strong> 入门指南</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">1.1.</strong> 安装</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">1.2.</strong> Hello, World!</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">1.3.</strong> Hello, Cargo!</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">2.</strong> 猜猜看游戏教程</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.</strong> 常见编程概念</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.1.</strong> 变量与可变性</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.2.</strong> 数据类型</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.3.</strong> 函数如何工作</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.4.</strong> 注释</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">3.5.</strong> 控制流</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">4.</strong> 认识所有权</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">4.1.</strong> 什么是所有权？</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">4.2.</strong> 引用与借用</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">4.3.</strong> Slices</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">5.</strong> 使用结构体来组织相关联的数据</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">5.1.</strong> 定义并实例化结构体</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">5.2.</strong> 一个使用结构体的示例程序</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">5.3.</strong> 方法语法</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">6.</strong> 枚举与模式匹配</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">6.1.</strong> 定义枚举</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">6.2.</strong> match 控制流运算符</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">6.3.</strong> if let 简洁控制流</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.</strong> 使用包、Crate 和模块管理不断增长的项目</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.1.</strong> 包和 crate</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.2.</strong> 定义模块来控制作用域与私有性</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.3.</strong> 路径用于引用模块树中的项</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.4.</strong> 使用 use 关键字将名称引入作用域</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">7.5.</strong> 将模块分割进不同文件</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">8.</strong> 常见集合</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">8.1.</strong> vector</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">8.2.</strong> 字符串</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">8.3.</strong> 哈希 map</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">9.</strong> 错误处理</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">9.1.</strong> panic! 与不可恢复的错误</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">9.2.</strong> Result 与可恢复的错误</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">9.3.</strong> panic! 还是不 panic!</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">10.</strong> 泛型、trait 与生命周期</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">10.1.</strong> 泛型数据类型</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">10.2.</strong> trait：定义共享的行为</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">10.3.</strong> 生命周期与引用有效性</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">11.</strong> 测试</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">11.1.</strong> 编写测试</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">11.2.</strong> 运行测试</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">11.3.</strong> 测试的组织结构</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.</strong> 一个 I/O 项目：构建命令行程序</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.1.</strong> 接受命令行参数</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.2.</strong> 读取文件</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.3.</strong> 重构以改进模块化与错误处理</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.4.</strong> 采用测试驱动开发完善库的功能</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.5.</strong> 处理环境变量</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">12.6.</strong> 将错误信息输出到标准错误而不是标准输出</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">13.</strong> Rust 中的函数式语言功能：迭代器与闭包</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">13.1.</strong> 闭包：可以捕获其环境的匿名函数</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">13.2.</strong> 使用迭代器处理元素序列</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">13.3.</strong> 改进之前的 I/O 项目</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">13.4.</strong> 性能比较：循环对迭代器</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.</strong> 更多关于 Cargo 和 Crates.io 的内容</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.1.</strong> 采用发布配置自定义构建</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.2.</strong> 将 crate 发布到 Crates.io</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.3.</strong> Cargo 工作空间</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.4.</strong> 使用 cargo install 从 Crates.io 安装二进制文件</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">14.5.</strong> Cargo 自定义扩展命令</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.</strong> 智能指针</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.1.</strong> Box<t> 指向堆上数据，并且可确定大小</t></a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.2.</strong> 通过 Deref trait 将智能指针当作常规引用处理</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.3.</strong> Drop Trait 运行清理代码</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.4.</strong> Rc<t> 引用计数智能指针</t></a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.5.</strong> RefCell<t> 与内部可变性模式</t></a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">15.6.</strong> 引用循环与内存泄漏是安全的</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">16.</strong> 无畏并发</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">16.1.</strong> 线程</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">16.2.</strong> 消息传递</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">16.3.</strong> 共享状态</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">16.4.</strong> 可扩展的并发：Sync 与 Send</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">17.</strong> Rust 的面向对象编程特性</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">17.1.</strong> 面向对象语言的特点</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">17.2.</strong> 为使用不同类型的值而设计的 trait 对象</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">17.3.</strong> 面向对象设计模式的实现</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">18.</strong> 模式用来匹配值的结构</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">18.1.</strong> 所有可能会用到模式的位置</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">18.2.</strong> Refutability：何时模式可能会匹配失败</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">18.3.</strong> 模式的全部语法</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.</strong> 高级特征</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.1.</strong> 不安全的 Rust</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.2.</strong> 高级 trait</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.3.</strong> 高级类型</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.4.</strong> 高级函数与闭包</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">19.5.</strong> 宏</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">20.</strong> 最后的项目: 构建多线程 web server</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">20.1.</strong> 单线程 web server</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">20.2.</strong> 将单线程 server 变为多线程 server</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">20.3.</strong> 优雅停机与清理</a></li></ol></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.</strong> 附录</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.1.</strong> A - 关键字</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.2.</strong> B - 运算符与符号</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.3.</strong> C - 可派生的 trait</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.4.</strong> D - 实用开发工具</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.5.</strong> E - 版本</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.6.</strong> F - 本书译本</a></li><li class="chapter-item expanded "><a href="javascript:;"><strong aria-hidden="true">21.7.</strong> G - Rust 是如何开发的与 “Nightly Rust”</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                
                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky bordered">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                        
                    </div>

                    <h1 class="menu-title">Rust 程序设计语言 简体中文版</h1>

                    <div class="right-buttons">
                        <a href="javascript:;" title="Print this book" aria-label="Print this book">
                            <i id="print-button" class="fa fa-print"></i>
                        </a>
                        
                    </div>
                </div>

                
                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>
                

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script type="text/javascript">
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1><a class="header" href="#rust-程序设计语言" id="rust-程序设计语言">Rust 程序设计语言</a></h1>
<blockquote>
<p><a href="javascript:;">title-page.md</a>
<br>
commit 636685fd35ca04a98fa73312d92eb2a46987ac96</p>
</blockquote>
<p><strong>Steve Klabnik 和 Carol Nichols，以及来自 Rust 社区的贡献（Rust 中文社区翻译）</strong></p>
<p>本书假设你使用 Rust 1.37.0 或更新的版本，且在所有的项目中的 <em>Cargo.toml</em> 文件中通过 <code>edition=&quot;2018&quot;</code> 采用 Rust 2018 Edition 规范。请查看 <a href="javascript:;">第一章的 “安装” 部分</a> 了解如何安装和升级 Rust，并查看新的 <a href="javascript:;">附录 E</a> 了解版本相关的信息。</p>
<p>Rust 程序设计语言的 2018 Edition 包含许多的改进使得 Rust 更为工程化并更为容易学习。本书的此次迭代包括了很多反映这些改进的修改：</p>
<ul>
<li>第七章 “使用包、Crate 和模块管理不断增长的项目” 基本上被重写了。模块系统和路径（path）的工作方式变得更为一致。</li>
<li>第十章新增了名为 “trait 作为参数” 和 “返回实现了 trait 的类型” 部分来解释新的 <code>impl Trait</code> 语法。</li>
<li>第十一章新增了一个名为 “在测试中使用 <code>Result&lt;T, E&gt;</code>” 的部分来展示如何使用 <code>?</code> 运算符来编写测试</li>
<li>第十九章的 “高级生命周期” 部分被移除了，因为编译器的改进使得其内容变得更为少见。</li>
<li>之前的附录 D “宏” 得到了补充，包括了过程宏并移动到了第十九章的 “宏” 部分。</li>
<li>附录 A “关键字” 也介绍了新的原始标识符（raw identifiers）功能，这使得采用 2015 Edition 编写的 Rust 代码可以与 2018 Edition 互通。</li>
<li>现在的附录 D 名为 “实用开发工具”，它介绍了最近发布的可以帮助你编写 Rust 代码的工具。</li>
<li>我们还修复了全书中许多错误和不准确的描述。感谢报告了这些问题的读者们！</li>
</ul>
<p>注意任何 “Rust 程序设计语言” 早期迭代中的代码在项目的 <em>Cargo.toml</em> 中不包含 <code>edition=&quot;2018&quot;</code> 时仍可以继续编译，哪怕你更新了 Rust 编译器的版本。Rust 的后向兼容性保证了这一切可以正常运行！</p>
<p>本书的 HTML 版本可以在 <a href="javascript:;">https://doc.rust-lang.org/stable/book/</a> （<a href="javascript:;">简体中文译本</a>）在线阅读，离线版则包含在通过 <code>rustup</code> 安装的 Rust 中；运行 <code>rustup docs --book</code> 可以打开。</p>
<p>本书的 <a href="javascript:;">纸质版和电子书由 No Starch Press</a> 发行。</p>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                        

                        
                            <a rel="next" href="javascript:;" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>
                        

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                

                
                    <a rel="next" href="javascript:;" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
                
            </nav>

        </div>

        

        

        
        
        
        <script type="text/javascript">
            window.playpen_copyable = true;
        </script>
        

        

        
        <script src="static/js/elasticlunr.min.js" type="text/javascript" ></script>
        <script src="static/js/mark.min.js" type="text/javascript" ></script>
        <script src="static/js/searcher.js" type="text/javascript" ></script>
        

        <script src="static/js/clipboard.min.js" type="text/javascript" ></script>
        <script src="static/js/highlight.js" type="text/javascript" ></script>
        <script src="static/js/book.js" type="text/javascript" ></script>

        <!-- Custom JS scripts -->
        
        <script type="text/javascript" src="static/js/ferris.js"></script>
        

        

    </body>
</html>
